package com.coffee.job.api.quartz.api;

import com.coffee.job.api.quartz.entity.TaskDefine;
import org.quartz.*;

import java.util.List;
import java.util.Map;

/**
 * quartz定时任务管理服务
 *
 * @author Xulg
 * Created in 2019-08-05 10:29
 */
public interface QuartzJobService {

    /**
     * 创建和启动 定时任务
     * {@link Scheduler#scheduleJob(JobDetail, Trigger)}
     *
     * @param define 定时任务
     */
    Void addScheduleJob(TaskDefine define);

    Void addScheduleJob(String name, String group, String cronExpression, String jobClassName, String description);



    /**
     * 暂停Job
     * {@link Scheduler#pauseJob(JobKey)}
     */
    Void pauseJob(JobKey jobKey);

    default Void pauseJob(String name, String group) {
        return this.pauseJob(JobKey.jobKey(name, group));
    }

    /**
     * 恢复Job
     * {@link Scheduler#resumeJob(JobKey)}
     */
    Void resumeJob(JobKey jobKey);

    default Void resumeJob(String name, String group) {
        return this.resumeJob(JobKey.jobKey(name, group));
    }

    /**
     * 删除Job
     * {@link Scheduler#deleteJob(JobKey)}
     */
    Void deleteJob(JobKey jobKey);

    default Void deleteJob(String name, String group) {
        return this.deleteJob(JobKey.jobKey(name, group));
    }

    /**
     * 修改Job的cron表达式
     */
    boolean modifyJobCron(String name, String group, String cronExpression);

    /**
     * 查询所有的job
     *
     * @return the job list
     */
    List<TaskDefine> queryAllJob();

    /**
     * 查询所有正在运行的job
     *
     * @return the running job
     */
    List<TaskDefine> queryAllCurrentRunningJob();

    /**
     * 获取定时任务的定义
     * JobDetail是任务的定义,Job是任务的执行逻辑
     *
     * @param jobKey      定时任务的名称 组名
     * @param description 定时任务的 描述
     * @param jobDataMap  定时任务的 元数据
     * @param jobClass    {@link Job} 定时任务的 真正执行逻辑定义类
     * @return the job detail
     */
    default JobDetail getJobDetail(JobKey jobKey, String description, JobDataMap jobDataMap, Class<? extends Job> jobClass) {
        return JobBuilder.newJob(jobClass).withIdentity(jobKey).withDescription(description)
                .setJobData(jobDataMap).usingJobData(jobDataMap).requestRecovery().storeDurably()
                .build();
    }

    /**
     * 获取Trigger (Job的触发器,执行规则)
     *
     * @param jobKey         定时任务的名称 组名
     * @param description    定时任务的 描述
     * @param jobDataMap     定时任务的 元数据
     * @param cronExpression 定时任务的 执行cron表达式
     */
    default Trigger getTrigger(JobKey jobKey, String description, JobDataMap jobDataMap, String cronExpression) {
        return TriggerBuilder.newTrigger().withIdentity(jobKey.getName(), jobKey.getGroup())
                .withDescription(description).withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
                .usingJobData(jobDataMap).build();
    }

    default JobDataMap getJobDataMap(Map<?, ?> map) {
        return map == null ? new JobDataMap() : new JobDataMap(map);
    }

}
